package com.easypay;

import com.alibaba.fastjson.JSONObject;
import com.easypay.util.HttpConnectUtils;
import com.easypay.util.RandomUtil;
import com.easypay.util.StringUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {



    public static void main(String[] args) {
        // write your code here
        // 商户审核结果查询
        //merchantAuditResult();

        // 商户信息查询
        merchantInformQuery();

        // 商户异步通知回调
        //merchantNotify();

        // 微信支付宝拆分
        // wechatAlipaySplit();

        // 新增终端
        //newTerminal();

        // 终端变更
        // changeTerminal();

        // 结算账户变更
        // changeSettlementAccount();

        // 商户功能变更
        // merchantFunctionChange();

        // 参数查询
        // queryParamter();

        // 查询授权码
        // queryinCode();

        // 查询限额
        // queryLimit();

        // 新增限额
        // newLimit();

        // 变更限额
        // updateLimit();

        // 商户营销信息查询
        // merMarketQuery();

        // 商户营销信息新增
        // merMarketAdd();

        // 商户营销信息变更
        // merMarketUpdate();

        // 商户营销信息注销
        // merMarketCancel();
    }

    public static final String CLIENTCODE = "50310202"; /** 机构号 -- 联调支持分配 */
    public static String AGENT_SIGN_KEY = "EDferdssserrtXDe";  /** 签名秘钥 -- 联调支持分配, 使用getSign接口更新 */


    /**
     * 接口测试地址 -- 联条支持提供
     */
    public static final String BASE_URL = "https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/gen";
    public static final String IMAGE_UPLOAD_URL = "https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/imgUpl";


    /**
     * 商户异步通知回调
     * 所有异步接口，包括商户入件、补件、变更、终端新增、变更等，都可通过该接口获取商户处理结果；
     * 该接口会回一些主要的字段：funcInfo信息是所有的功能字段；sysInfo:包括内部商户号（merCode）,终端名称（username）,终端商户号（termMercode）,终端终端号（termTermcode）,渠道商户号（bangdingcommercode）,渠道终端号（bangdingtermno）
     */
    public static void merchantNotify() {
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 回调地址
        request.put("backUrl","https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
        // 成功可获得 商户唯一标识merTrace
    }

    /**
     *  商户审核结果查询
     *  在没有收到回调通知或者没有送回调地址时，主动调取该接口获得审核结果
     */
    public static void merchantAuditResult(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","QUERYAUDMER");
        // 回调地址
        request.put("backUrl","https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水 原操作流水号
        request.put("operaTrace","XUIZC2NYauErnXih3gf7");

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);

        //成功可获得审核结果
    }


    /**
     *  商户信息查询
     *  出图片上传外，其他接口测试地址：https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/gen
     *  该接口用于主动获取商户、终端等信息；
     */
    public static void merchantInformQuery(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","QUERYMER");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);

        //成功可获取商户、终端等信息
    }

    /**
     *  商户信息变更
     *  该接口用于修改商户信息（包括图片信息）；
     *  该接口只需送需要变更的字段，不需要变更的字段可以不送；
     */
    public static void merchantChangeInfor(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ALTERMER");
        // 回调地址
        request.put("backUrl","https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);


    }
    /**
     * 新增终端
     * 该接口一次请求仅允许新增一台终端
     */
    public static void newTerminal(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ADDSYSTERM");
        // 回调地址
        request.put("backUrl","");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  终端变更
     *  该接口一次请求仅允许变更一台终端
     */
    public static void changeTerminal(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ALTERSYSTERM");
        // 回调地址 o
        request.put("backUrl","");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);

    }

    /**
     *  结算账户变更
     *  picInfoList：变更结算账户，需要补齐所有结算账户对应的图片（开户许可证、银行卡、清算授权书）
     */
    public static void changeSettlementAccount(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ALTERPAYACC");
        // 回调地址 o
        request.put("backUrl","");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  商户功能变更
     *  该接口用于变更商户功能信息
     *  说明：当新开通银行卡收单（funcId=23）时，同时需要上送终端信息
     */
    public static void merchantFunctionChange(String funcId){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ALTERFUNC");
        // 回调地址
        request.put("backUrl","");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));
        // 功能信息
        JSONObject funcInfoJson = new JSONObject();
        request.put("funcInfo",funcInfoJson.toJSONString());
        // 银行卡收单标志
        String bankFlag = "23";
        JSONObject sysInfoJson = null;
        if(bankFlag.equals(funcId)){
            sysInfoJson = new JSONObject();
            request.put("sysInfo",sysInfoJson.toJSONString());
        }

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  参数查询
     *  该接口用于查询其他接口终端需要的参数，目前仅支持查询终端参数里的设备型号（termModel）
     */
    public static void queryParamter(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","QUERYPARA");
        // 参数类型
        request.put("paraType","01");
        // 参数名称
        request.put("paraName","百富");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /***
     *  查询授权码
     *  该接口用于查询实体终端的授权码
     */
    public static void queryinCode(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","QUERYAUTH");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 商户号
        request.put("termMercode","");
        // 终端号
        request.put("termTermcode","");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);

    }
    /**
     *  微信支付宝拆分
     *  拆分成功：回调报文或者商户审核查询接口有返回子商户号(wechatId或者alipayId)；
     */
    public static void wechatAlipaySplit(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode","67923225");
        // 报文类型
        request.put("messageType","SENDZFBORWX");
        // 回调地址
        request.put("backUrl","");
        // 商户唯一标识
        request.put("merTrace","6262744d3e10af79d539d");
        // 操作类型 add-新增；目前仅支持新增（add)
        request.put("operType","add");
        // 操作流水 20220424094318769502 50312022042402510667
        request.put("operaTrace","20220424094318769502");
        // 拆分类型
        request.put("tradeType","Z");
        // 渠道类型 	unionPay-银联；netPay-网联
        request.put("playType","unionPay");
        // 公众号名称
        request.put("pubName","");
        // 是否小程序  	0-否(默认)；1-是
        request.put("isMini","0");
        // 支付宝appid 	如果不送，则取默认配置（支付宝拆分时生效）
        request.put("appId","");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  查询限额
     *  该接口用于查询商户限额；
     */
    public static void queryLimit(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","TRADELIMIT");
        // 商户唯一标识 merTrace和merCode必须传一个
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 内部商户号 merTrace和merCode必须传一个
        request.put("merCode","");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  新增限额
     *  该接口用于新增商户限额
     */
    public static void newLimit(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","ADDCREDITLIMIT");
        // 商户唯一标识 merTrace和merCode必须传一个
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 内部商户号 merTrace和merCode必须传一个
        request.put("merCode","");
        // 交易类型 1S01-秒到借记卡;1S02-秒到信用卡;1S00-秒到全卡种;2101-微信交易;2102-支付宝交易;2103-银联二维码交易;21XX-移动支付全交易
        request.put("tradeType","1S01");
        // 日单笔限额 单位：元，不限制为 9999999999.99
        request.put("singleAmt","50000");
        // 每日合计限额	单位：元，不限制为 9999999999.99
        request.put("dailySum","100000");
        // 每月合计限额
        request.put("monthlySum","10000000");
        // 每日笔数限制	 不限制为 9999999999
        request.put("dailyCount","5");
        // 每月笔数限制
        request.put("monthlyCount","20");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }
    /**
     *  变更限额
     *  该接口用于变更商户限额
     */
    public static void updateLimit() {
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","UPDCREDITLIMIT");
        // 商户唯一标识 merTrace和merCode必须传一个
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 内部商户号 merTrace和merCode必须传一个
        request.put("merCode","");
        // 交易类型 1S01-秒到借记卡;1S02-秒到信用卡;1S00-秒到全卡种;2101-微信交易;2102-支付宝交易;2103-银联二维码交易;21XX-移动支付全交易
        request.put("tradeType","1S01");
        // 日单笔限额 单位：元，不限制为 9999999999.99
        request.put("singleAmt","50000");
        // 每日合计限额	单位：元，不限制为 9999999999.99
        request.put("dailySum","100000");
        // 每月合计限额
        request.put("monthlySum","10000000");
        // 每日笔数限制	 不限制为 9999999999
        request.put("dailyCount","5");
        // 每月笔数限制
        request.put("monthlyCount","20");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *  商户营销信息查询
     *  该接口用于查询商户营销的配置信息
     */
    public static void merMarketQuery() {
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","QUERYREBATE");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 内部商户号
        request.put("merCode","");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }
    /**
     *  商户营销信息新增
     *  该接口用于新增商户营销的配置信息
     */
    public static void merMarketAdd() {
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","MERREBATE");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 操作类型 insert-当月新增；insertNext-次月新增; costom-自定义日期
        request.put("playType","insert");
        // 优惠类型 A001 — 按月交易金额累计额度; B001 — 按月手续费累计额度
        request.put("rebateType","A001");
        // 优惠额度 单位：元
        request.put("rebateAmtHigh","100");
        // 优惠方式	0 — 固定值， 1 — 折扣比率 ，2 — 按本金优惠比率
        request.put("rebateMode","0");
        // 优惠值 	当优惠方式为0时，单位为元；当优惠方式为1、2时，单位为：%
        request.put("rebateVal","10");
        // 优惠商业模型 0000 — 手续费优惠
        request.put("rebateBuss","0000");
        // 卡类型 XXXX — 全部 借记卡 000D 贷记卡 000C
        request.put("cardKind","XXXX");
        // 业务类型 XXXX — 可以多选：每个业务类型编码后加‘,’ 刷卡 A001 微信 R001 支付宝 R002 银联条码 A101 二维码营销（1000以下）E001
        request.put("bussType","R001");
        // 笔数限制
        request.put("limitPronum","30");
        // 时间范围	 	A — 按天， B — 按月，0 — 不限制；当limitPronum不为0时，该字段必须上送
        String limitPronum = request.get("limitPronum");
        if("0" != limitPronum && null != limitPronum){
            request.put("limitDttype","B");
        }
        // 每笔交易金额限制 	单位：元
        request.put("limitHamt","10000");
        // 优先级 营销策略优先级： 数字越大优先级越高 默认 0
        request.put("levelOrder","");
        // 活动ID	 生产时易生提供
        request.put("rebateNo","");
        // 生效时间 当playType=costom 必填 生效时间 yyyyMMddHHmmss
        String playType = request.get("playType");
        SimpleDateFormat format = null;
        if("constom".equals(playType) && null != playType){
            String nowtime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            request.put("effDate",nowtime);
        }
        // 当playType=costom 必填 失效时间 yyyyMMddHHmmss
        if("constom".equals(playType) && null != playType){
            String nowtime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            request.put("expDate",nowtime);
        }
        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     *   商户营销信息变更
     *   该接口用于变更商户营销的配置信息
     */
    public static void merMarketUpdate(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","MERREBATE");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 营销记录ID	新增时返回
        request.put("rebateRecid","");
        // 操作类型 updateNew-更新
        request.put("playType","updateNew");
        // 优惠额度 	单位：元
        request.put("rebateAmtHigh","100");
        // 优惠值 当优惠方式为0时，单位为元；当优惠方式为1、2时，单位为：%
        request.put("rebateVal","10");
        // 优惠商业模型 0000 — 手续费优惠
        request.put("rebateBuss","0000");
        // 卡类型 XXXX — 全部 借记卡 000D 贷记卡 000C
        request.put("cardKind","XXXX");
        // 业务类型 XXXX — 可以多选：每个业务类型编码后加‘,’ 刷卡 A001 微信 R001 支付宝 R002 银联条码 A101 二维码营销（1000以下）E001
        request.put("bussType","R001");
        // 笔数限制
        request.put("limitPronum","30");
        // 时间范围	 	A — 按天， B — 按月，0 — 不限制；当limitPronum不为0时，该字段必须上送
        String limitPronum = request.get("limitPronum");
        if("0" != limitPronum && null != limitPronum){
            request.put("limitDttype","B");
        }
        // 每笔交易金额限制 	单位：元
        request.put("limitHamt","10000");
        // 内部商户号
        request.put("merCode","");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }
    /**
     *  商户营销信息注销
     *  该接口用于变更商户营销的配置信息
     */
    public static void merMarketCancel(){
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号 67923225
        request.put("clientCode",CLIENTCODE);
        // 报文类型
        request.put("messageType","MERREBATE");
        // 商户唯一标识
        request.put("merTrace","61bfe1051faf202cd074a52e");
        // 营销记录ID	新增时返回
        request.put("rebateRecid","");
        // 操作类型 	deleteNew-注销
        request.put("playType","deleteNew");

        // 签名校验
        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     * 计算sign, 将sign 写入Map中
     * @param request 请求内容不包含sign
     * @param signKey 签名key
     */
    public static void calSignAndPut(Map<String, String> request, String signKey) {
        String md5 = calSign(request, signKey);
        request.put("MAC", md5);
    }

    /**
     * 计算sign
     * @param request 请求内容不包含sign
     * @param signKey 签名key
     */
    public static String calSign(Map<String, String> request, String signKey) {
        Set<String> keySet = request.keySet();
        TreeSet<String> treeSet = new TreeSet<>(keySet);
        StringBuilder stringBuilder = new StringBuilder();
        for(String key : treeSet) {
            if(!"MAC".equals(key) && !StringUtils.isEmpty(request.get(key))) {
                stringBuilder.append(key).append("=").append(request.get(key)).append("&");
            }
        }
        stringBuilder.append("key=").append(signKey);
        String str = stringBuilder.toString();
        System.out.println("待签名字段：：====>" + str);
        String md5 = calMD5(str);
        return md5;
    }
    /**
     * MD5 算法
     * @param data 待计算源数据
     * @return md5值
     */
    public static String calMD5(String data) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(data.getBytes(StandardCharsets.UTF_8));
            return toHexString(md.digest()).toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static final char[] HEX_CHAR = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    public static String toHexString(byte[] bytes) {
        char[] buf =  new char[bytes.length * 2];
        int index = 0;
        for(byte b: bytes) {
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }
        return new String(buf);
    }
    /**
     * @param request: 请求参数, 不包含sign
     * @Description 公用请求串
     * @date: 2021/10/24 11:29
     * @author: pandans
     */
    public static String doRequest(Map<String, String> request) {
        return doRequest(BASE_URL, request);
    }
    public static String doRequest(String url, Map<String, String> request) {
        try {
            String response = HttpConnectUtils.sendHttpSRequest( BASE_URL, request, "POST", null);
            System.out.println("响应报文：：" + response);
            return response;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 根据返回的内容计算签名
     * @param response 服务器返回报文
     * @param signKey 签名KEY
     * @return
     */
    public static boolean checkSign(String response, String signKey) {
        Map<String, String> signMap = JSONObject.parseObject(response, Map.class);
        // 报文返回的签名
        String sign = signMap.get("sign");
        if(sign == null) {
            System.err.println("验证签名：====》！！！！非成功业务无Sign返回");
            return false;
        }
        // 报文计算的签名
        String calSign = calSign(signMap, signKey);
        boolean res = sign.equals(calSign);
        System.out.println("验证签名：====》" + res);
        return res;
    }
}
